Go 超时

超时对那些连接外部资源的程序来说是很重要的,否则就需要限定执行时间。在Go里面实现超时很简单。我们可以使用channel和select很容易地做到。

  1. package main
  2. import "time"
  3. import "fmt"
  4. func main() {
  5. // 在这个例子中,假设我们执行了一个外部调用,2秒之后将结果写入c1
  6. c1 := make(chan string, 1)
  7. go func() {
  8. time.Sleep(time.Second * 2)
  9. c1 <- "result 1"
  10. }()
  11. // 这里使用select来实现超时,`res := <-c1`等待通道结果,
  12. // `<- Time.After`则在等待1秒后返回一个值,因为select首先
  13. // 执行那些不再阻塞的case,所以这里会执行超时程序,如果
  14. // `res := <-c1`超过1秒没有执行的话
  15. select {
  16. case res := <-c1:
  17. fmt.Println(res)
  18. case <-time.After(time.Second * 1):
  19. fmt.Println("timeout 1")
  20. }
  21. // 如果我们将超时时间设为3秒,这个时候`res := <-c2`将在
  22. // 超时case之前执行,从而能够输出写入通道c2的值
  23. c2 := make(chan string, 1)
  24. go func() {
  25. time.Sleep(time.Second * 2)
  26. c2 <- "result 2"
  27. }()
  28. select {
  29. case res := <-c2:
  30. fmt.Println(res)
  31. case <-time.After(time.Second * 3):
  32. fmt.Println("timeout 2")
  33. }
  34. }

运行结果

  1. timeout 1
  2. result 2